# -*- coding: utf-8 -*-
# autor: Pedro Caixinha
# data: 2 Outubro de 2014
# obs.: primeiro programa realizado em Python
#
#print "Hello World"

#------------------Identação----------------#
#def is_even(a):
#    if a % 2 == 0:
#        print('Even!')
#        return True
#    else:
#        print('Odd!')
#        return False

#--------------Tipos Numéricos-----------------#
# -*- codding: utf-8 -*-
import decimal
import mpmath
import sys
a = 99 #int
print sys.maxint #maximo inteiro
u = 99.76 #float
v = 2 + 2j #complex
z = u + v #soma the um complexo com um float
print z, z.real, z.img #resultado no ecran
#um decimal
b = decimal.Decimal(4.42347529760276257652678257696)
w = mpmath.mpf(4.23331) #precisao arbitraria

#--------------Tipos Sequênciais-----------------#
# -*- coding: utf-8 -*-
s1 = "The 'Portuguese' Inquisition" #Uma string
s2 = "tRoiKa"                       #Mais um string
s3 = s1 + ' ' + s2                  #Concatenação
l1 = [1, 2, "lista", [3, 4, 5.33]]  #Uma lista
a = l1[0] + l1[1] + l1[3][1]        #Soma de valores
t1 = (1, 2, "tuplo")
print t1[1]

#--------------Estruturas de Controlo - Selecções ----------#
#-*- coding: utf-8 -*-
if 1 > 0:
    print "OK"
if 1.2 == 33:
    print "NO"
else:
    print "OK"
expr1 = True or False
expr2 = True and False
if expr1:
    if expr2:
        print "OK"
    else:
        print "NOT"
else:
    print "NOT"
#------------Estruturas de Controlo - Ciclo for --------------#
for i in range(0, 10):       #vai de 0 até 9 inclusive
    print i * i
l1 = range(20, 30)           #lista de numeros
print
soma = 0
for x in l1:
    soma += x                #soma dos numeros de l1
for k in xrange(20, 0, -1):  #20 downto 1 inclusive
    if k > 10:
        print k
    else:
        print 2 * k

#-----------Estruturas de Controlo - Ciclo While --------------#
#-*- coding: utf-8 -*-
l1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
l2 = []
k = len(l1)
while k:           #0 é considerado
    if k % 2:
        #se k for impar
        l2.append(k)
    else:
        print k, "par"
    k -= 1
print l2 #Lista de impares

#---------------Estruturas de controlo - Ciclo while------------#
a = 0
k = 20
while True:
    a += 1
    if a > k:
        break
    if a % 2:
        continue
    print "valor de a ", a
x = 1
while x < 10:
    print x
    x += 1
else:
    print "Finito"

#-----------------------Funções-----------------------------#
#-*- coding: utf-8 -*-
def fsoma(a, b): #declaração da função
    '''
    fsoma - soma de 2 valores
    a - um inteiro
    b - outro inteiro
    '''
    if isinstance(a, int) and isinstance(b, int):
        soma = a + b
    else:
        print "a ou b não são inteiros e a soma será nula"
        soma = 0
    return soma
y1 = fsoma(2, 3)
y2 = fsoma(4.3, "League of Legends")

#-----------------Funções-------------------------#
#-*- coding: utf-8 -*-
def frec(l1, x, n):
    '''
    frec - devolve um lista com n elementos x
    x - o elemento a repetir
    n - numero de repetiçoes
    '''
    if not n:
        return l1
    else:
        return [x] + frec(l1, x, n-1)
l2 = frec([], 'Bu ', 5)
print l2

#----------------------Funções------------------------#
#-*- coding: utf-8 -*-
def func1(a, b, c=True):
    '''
    func1 - função com parametros por defeito
    '''
    if c:
        return a + b
    else:
        return a - b
print func1(2, 3)
print func1(4, 5, False)
